/*
*
*
*     文档创建：jjl, jjl@hzncc.com
*     rmii 协议，当crs_dv有效时候，首先接收到的是 JK信号，preamble， sfd，data
*     本模块对协议预先处理，去掉JK信号和crs_dv结尾的载波监听信号。
*/


module rmii_preop(
            sys_clk         ,
            sys_reset_n     ,
            crs_dv_i        ,
            rxd_i           ,
            rxdv_o          ,
            rxd_o
        );

    input           sys_clk         ;
    input           sys_reset_n     ;
    input           crs_dv_i        ;
    input   [1:0]   rxd_i           ;
    output          rxdv_o          ;
    output  [1:0]   rxd_o           ;
    
    //对输入信号打二拍
    logic   [1:0]   rxd_r           ;
    logic           crs_dv_r        ;
    logic   [1:0]   rxd_rr          ;
    logic           crs_dv_rr       ;
    always_ff@(posedge sys_clk or negedge sys_reset_n)
    if(~sys_reset_n)    begin
        rxd_r       <=      '0      ;
        crs_dv_r    <=      '0      ;
        rxd_rr      <=      '0      ;
        crs_dv_rr   <=      '0      ;
    end else begin
        rxd_r       <=      rxd_i   ;
        crs_dv_r    <=      crs_dv_i;
        rxd_rr      <=      rxd_r   ;
        crs_dv_rr   <=      crs_dv_r;
    end

    //对crs_dv的尾巴进行处理,crs_dv两拍同时为低，才能算rxdv无效
    wire rxdv_en;
    assign rxdv_en = (crs_dv_rr) | (crs_dv_r);

    //如果rxdv_en有效
    logic rxdv_r    ;
    always_ff@(posedge sys_clk or negedge sys_reset_n)
    if(~sys_reset_n)    begin
        rxdv_r      <=      '0      ;
    end else if(rxdv_en & (rxd_rr == 2'b01))begin //滤掉JK
        rxdv_r      <=      1'b1    ;
    end else if(~rxdv_en)
        rxdv_r      <=      1'b0    ;


    assign rxdv_o = rxdv_r  ;

    logic [1:0] rxd_o_r ;
    always_ff@(posedge sys_clk or negedge sys_reset_n)
    if(~sys_reset_n)    begin
        rxd_o_r     <=      '0      ;
    end else 
        rxd_o_r     <=      rxd_rr  ;
    assign rxd_o = rxd_o_r;
endmodule
